Skip to content
On this page

1. 学前疑问

HTTPS是什么,听过但未了解过,一知半解,趁着这次把他捋一捋,避免一直在知识盲区,目前有以下疑问

  1. HTTPS是什么
  2. 其解决了什么问题
  3. 与HTTP的关系

2. 初步了解

全称 Hypertext Transfer Protocol Secure ,中文名 超文本传输安全协议。在HTTP和TCP中间添加一个加密/身份验证层(SSL层),可以理解是HTTP的安全升级版。
HTTPS的目的是去除中间人,避免中间人攻击。

3. 整体框架

对称加密 + 非对称加密 + CA证书
利用了以上几项结合去实现HTTPS加密机制。接下来会逐步讲解,指明各项优缺点,以及为何需要结合使用。

4. 学习目标

知道其大概实现方式,自己申请域名,并且添加https,实操一番。为以后小程序部署做好基础

5. 详细内容

5.1 对称加密

我们想要对一个内容加密或解密的时候,常常需要使用密码。为了方便与网络通信的名词对应,在后续我们都把密码称为密钥,当加密和解密都使用同一个密钥,那我们把这种加密方式叫作对称加密。
例如:压缩包加解密,压缩时候输入密码,解压时需要输入同一个密码。

js
/**
 * 加密
 * @params key 密码或称为密钥
 * @params message 通信内容
 * @return 加密密文
 */
secret = encrypt(key, message);

/**
 * 解密
 * @params key 密码或称为密钥
 * @params secret 加密密文
 * @return 通信内容
 */
plain = decrypt(key, secret);

// 使用同个密钥key进行加解密,称这种加密方式为对称加密。
// 例如:
// 客户端使用 密钥123 对通信内容“你好”进行加密,得到加密密文xxxx
// 加密密文通过网络传输给服务端
// 服务端使用 密钥123 对加密密文xxxx进行解密,得到通信内容“你好”

// 如果是非对称加密,使用的密钥key会不同

在网络通信中,对称加密的使用十分频繁,往往都是客户端在本地新建一个密钥,然后传输给服务端,跟服务端约定好,共同使用这个密钥来加/解密后续传输的内容。因为传输的内容不是明文,没有密钥的人便无法得知内容。
以下为粗略图解

客户端                           服务端    
|生成密钥         ->       接收密钥     |
...                          
...                          
...                          
|密钥加密 xxx     ->       密钥解密 明文|
|密钥解密 明文    <-       密钥加密 xxx |

对称加密使用的是同一个密钥,在加解密时速度很快。但问题在于第一步,如何告知对方密钥,且不会将密钥明文暴露给公共环境。

因为一旦暴露给公共环境,有目的的人拿到该密钥后便能解密传输内容,加密了相当于没加密。为了解决该问题,有以下两种方法:

  1. 客户端在制造时,直接在本地写入世界上所有服务器和他约定好的密钥。
    这种方式显然不可取。虽然从根源上避开密钥在网络传输,但是要写入的数据量实在过大,服务端也无法存下所有客户端的密钥。
  2. 非对称加密和对称加密结合使用,后面会详细讲。

以上,我们总结下对称加密的特点

  1. 由于是对称加密,加解密快
  2. 得知密钥的人,可以加密和解密数据。
  3. 密钥需要通过公共环境(网络),有暴露风险。

扩展

  • 常用对称加密算法有DES、AES和IDEA
  • 使用对称加密算法需要指定算法名称、工作模式和填充模式。 阮一峰老师 对称加密1

5.2 非对称加密

在密钥会被拦截的前提下,为了解决对称加密后数据相当于明文传输的问题。非对称加密,可以一定程度解决该问题。
非对称加密,在服务端生成两个密钥,发给客户端的称为公钥,服务端自己保留的称为私钥。公钥加密的内容只能由私钥解密,私钥加密的内容只能用公钥解密。

加密   解密   结果

公钥   公钥   No
公钥   私钥   Yes

私钥   公钥   Yes
私钥   私钥   No

即使公钥通过网络进行明文传输,且被中间人拦截。客户端用公钥加密过的内容,也不会被中间人破解。因为中间人只有公钥,而公钥是无法破解公钥加密的内容,只有私钥可以解密,而私钥还好好地存放在服务端。

这意味着,客户端使用公钥加密的内容,除了服务端拥有私钥可以解密,其他人都无法解密。那么问题来了,公钥大家都拥有,服务端使用私钥加密的内容,拥有公钥的都能进行解密吗?答案是肯定的,拥有公钥的都可以解密。

以上,我们来总结下非对称加密的特点

  1. 效率慢了许多
  2. 公钥加密只有私钥能解密,私钥仅服务端拥有,可以保障客户端发送数据时的安全性。
  3. 私钥加密只有公钥能解密,但是公钥经过网络传输,公钥的拥有者不一定只有目标客户端,拥有公钥的都可以解密,无法保障服务端发送数据的安全性

5.3 非对称加密-升级

根据非对称加密的特点,服务端的私钥加密的内容,公钥可以解密,而公钥通过网络传输可能被拦截。只能保障客户端发送数据的安全性,而无法保障服务端发送数据的安全性。非对称加密-升级可以解决该问题
那如果服务端不使用私钥加密,而是使用另一个加密,是不是就能保障服务端发送数据的安全性?答案是肯定的。
倘若客户端跟服务端一样创建私钥公钥,并将其公钥发给服务端,服务端使用客户端的公钥对数据进行加密后发送,而客户端的私钥仅自己拥有,除了客户端,其它人都无法解密服务端发给客户端的消息。


客户端                 服务端 
|发送客公钥   ->             |
|             <-   发送服公钥| 

|服公钥加密   ->    服私钥解密|
|客私钥解密   <-    客公钥加密|

以上,我们来总结下非对称加密-升级的特点

  1. 都是非对称加密,效率慢了许多
  2. 两端发送数据的安全性都有保障。

5.4 非对称加密 + 对称加密

非对称加密-升级,确实保障了两端发送数据的安全性。但全程使用非对称加密,效率太慢。在两端发送数据安全的前提下,解决加解密效率太慢的问题。可以考虑非对称加密 + 对称加密结合。

加解密慢主要原因是全程使用了非对称加解密,如果可以在保障安全的地方使用非对称加密,其余地方使用对称加密传输数据,那效率会大大提高。
所以出发点落在对称加密上,对称加密的缺点是,密钥明文经网络传输,可能被拦截获取。那如果对密钥进行非对称加密呢?
使用非对称加密,客户端拿到公钥后,使用公钥对对称加密的【密钥】进行加密,并传给服务端。
这样【密钥】就不是明文传输的了。没有私钥的人,也无法得知【密钥】的真实内容,后续用密钥进行对称加密进行传输数据即可。

客户端                    服务端 
|请求公钥      ->               | 
|             <-        发送公钥| 
|公钥加密密钥  ->  私钥解密取密钥|
...                          
... 后续跟对称加密一致                    
...
|密钥加密      ->        密钥解密|
|密钥解密      <-        密钥加密|

以上,我们来总结下非对称加密 + 对称加密的特点

  1. 效率快,除了第一次传递【对称加密的密钥】用的是非对称加密,其余都是对称加密
  2. 两端发送数据的安全性都有保障。
  3. 无法避开中间人攻击,后续详细讲

5.5 中间人攻击

非对称加密 + 对称加密已经很完美了,为什么说无法避开中间人攻击,中间人是什么?
中间人:拦截数据,模拟客户端/服务端,骗取信息。以下是模型

客户端                    中间人                            服务端 
|请求公钥      ->                                                | 
|             <-       发送中间人公钥                            |

|                      请求服务器公钥      ->                    | 
|                                         <-       发送服务器公钥| 

|中间人公钥加密密钥  -> 中间人私钥解密取密钥                       |
                       服务器公钥加密密钥  ->  服务器私钥解密取密钥|

                       
...                          
... 后续对称加密                  
...

|密钥加密      ->         密钥解密/密钥加密  ->           密钥解密|
|密钥解密      <-         密钥解密/密钥加密  <-           密钥加密|

可以看出,从客户端一开始请求公钥,便是和中间人对接,拿到中间人的公钥,就跟正常对的服务端的方式一样操作了。对客户端来说,无法感知中间人的存在。

服务端也是一样的,中间人就是他的客户端,服务端也无法感知真正客户端的存在。
在以上对称加密,非对称加密,非对称加密-升级,对称加密+非对称加密的场景下,中间人攻击都能一一攻陷。原因是,中间人攻击是在第一步便介入了,客户端认不清是中间人或服务端。

中间人是在第一步获取公钥的时候便介入,客户端有没有办法在第一步进行识别?只要客户端能识别出中间人不是服务端,便不会与他进行数据交互。那答案肯定是有办法,数据证书就是专门解决这个问题的。

5.6 数字证书

现实生活中坐高铁飞机,如何证明你是你,常用方法是使用公关机关派发的身份证。在网络中,也有一个权威机构,赋值颁发“身份证”,用于标准网站的绝对唯一性,避免冒充。

总结

  1. 对称加密效率高。
  2. 非对称加密可以解决对称加密密钥的明文问题。
  3. 数字证书可以解决中间人攻击

课后疑问

  1. 对称加密算法需要指定算法名称、工作模式和填充模式。 什么意思
  2. 对称加密的快 非对称加密的慢,有什么标准吗。怎么形容它的快和慢到哪种程度

参考资料